package com.哈希表;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那 两个 整数，并返回他们的数组下标。
 *
 * 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素不能使用两遍。
 *
 *
 *
 * 示例:
 *
 * 给定 nums = [2, 7, 11, 15], target = 9
 *
 * 因为 nums[0] + nums[1] = 2 + 7 = 9
 * 所以返回 [0, 1]
 */
public class 两数之和 {
  static   class Solution {
        public int[] twoSum(int[] nums, int target) {
            MyHashMap map = new MyHashMap();
            for(int i = 0;i<nums.length;i++){
                map.put(nums[i],i);
            }
            for(int i = 0;i<nums.length;i++){
                int another = target-nums[i];
                if(map.containsKey(another) && map.get(another) != i){
                    return new int[]{i,map.get(another)};
                }
            }
            return null;

        }
      public int[] twoSum2(int[] nums, int target) {
            if (nums.length<2){
               throw new RuntimeException("数组长度太小");
            }

          for(int i = 0;i<nums.length-1;i++){
              for(int j = i+1;j<nums.length;j++){
                  if(nums[i]+nums[j]==target){
                      return new int[]{i,j};
                  }
              }
          }
          throw new RuntimeException("没有和");

      }

      /**
       * 哈希表
       * @param nums
       * @param target
       * @return
       */
      public int[] twoSum3(int[] nums, int target) {
          MyHashMap myHashMap  = new MyHashMap();
          for(int i  =  0; i<nums.length;i++){

              int another = target-nums[i];
             if(myHashMap.containsKey(another)){
                 return new int[]{i,myHashMap.get(another)};
             }
             myHashMap.put(nums[i],i);
          }
        throw new RuntimeException("没有和");
      }

      public int[] twoSum4(int[] nums, int target) {
          Map<Integer,Integer> myHashMap  = new HashMap<>();
          for(int i  =  0; i<nums.length;i++){

              int another = target-nums[i];
              if(myHashMap.containsKey(another)){
                  return new int[]{i,myHashMap.get(another)};
              }
              myHashMap.put(nums[i],i);
          }
          throw new RuntimeException("没有和");
      }


        public static void main(String[] args) {
            Solution solution = new Solution();
            int[] num = new int[]{1,2,3,4,5};
            Arrays.stream(solution.twoSum3(new int[]{1,2,3}, 4)).forEach(System.out::println
            );

        }
    }
}
